package generator.workflow.sfj.gridgain;

import generator.datastructure.MethodDeclaration;
import generator.workflow.BindingManager;

/**Esta clase extiende a la clase {@link BindingManager} redefiniendo la operacion de 
 * ligadura con el método gridificado de la clase Peer instanciado para el middleware de
 * GridGain. De esta manera provee un template method que define el comportamiento del método
 * bindMethodCall(MethodDeclaration md) declarado en la clase de la que extiende. Dicho template
 * incluye sentencias de inicio y parada del nodo GridGain desde el cual se iniciará la ejecución
 * @author Hirsch-Fernández*/
public abstract class GridGainBindingManager extends BindingManager {

	/**{@inheritDoc}
	 * La implementación de este método incluye sentencias de inicio y parada del nodo GridGain
	 * desde el cual se iniciará la ejecución. Entre medio de estas se inserta el llamado al método
	 * gridificado de la clase Peer*/
	@Override
	protected void bindMethodCall(MethodDeclaration md) {
		this.startUpGrid(md);
		this.insertPeerClassCall(md);
		this.stopGrid(md);		
	}

	/** Inserta dentro del método a gridificar de la clase original del usuario 
	 * el llamado al método que detiene la instancia del grid.
	 * @param methodDeclaration
	 * 			representa la declaración del método que se pretende gridificar. De allí pueden extraerse
	 * 			datos tales como su nombre, parámetros de entrada y tipo de resultado devuelto, nombre y
	 * 			ubicación de la clase a	la que pertenece*/
	protected abstract void stopGrid(MethodDeclaration methodDeclaration);

	/**A través de este método se inserta el llamado al método gridificado de la clase Peer que iniciará
	 * la ejecución distribuida del método que se desea gridificar.
	 * @param methodDeclaration
	 * 			representa la declaración del método que se pretende gridificar. De allí pueden extraerse
	 * 			datos tales como su nombre, parámetros de entrada y tipo de resultado devuelto, nombre y
	 * 			ubicación de la clase a	la que pertenece*/
	protected abstract void insertPeerClassCall(MethodDeclaration methodDeclaration);

	/** Inserta dentro del método a gridificar de la clase original del usuario 
	 * el llamado al método que permiten obtener una instancia del grid al cual se
	 * enviarán los trabajos que se vayan creando durante la ejecución.
	 * @param methodDeclaration
	 * 			representa la declaración del método que se pretende gridificar. De allí pueden extraerse
	 * 			datos tales como su nombre, parámetros de entrada y tipo de resultado devuelto, nombre y
	 * 			ubicación de la clase a	la que pertenece*/
	protected abstract void startUpGrid(MethodDeclaration methodDeclaration);
	

}
